package com.it.reggie.controller;


import com.it.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.UUID;

//进行文件的上传和下载
@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {

    @Value("${reggie.path}")//必须是org.springframework.beans.factory.annotation提供的Value
    private String basePath;

    //文件上传
    @PostMapping("/upload")
    public R<String> upload(MultipartFile file){
//file必须跟前端upload.html页面的检查-Network-Headers右边的Payload-Form Data-Content-Disposition:name="file"一致
//file是一个临时文件，需要转存到指定位置，否则本次请求完成后临时文件会删除
        log.info("上传的文件是"+file.toString());
//获取上传文件的原始文件名
        String originalFilename = file.getOriginalFilename();//abc.jpg
        //截取.jpg等文件后缀(suffix)
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));//从最后的 . 开始截

        System.out.println("截到了吗"+suffix);
        //使用UUID重新生成文件名，防止文件名称重复，造成文件覆盖
        String filename = UUID.randomUUID().toString() + suffix;//xfdccdd.jpg

        //创建一个目录对象
        File dir = new File(basePath);
        //判断是否存在该目录
        if(!dir.exists()){
            //目录不存在，需要创建
            dir.mkdirs();//创建application.yml里的reggie下的path里面的DLSS
        }
        try {
            //转存到指定位置
            file.transferTo(new File(basePath + filename));//"D:\DLSS\123.jpg"
        } catch (IOException e) {
            e.printStackTrace();
        }
        return R.success(filename);//页面新增菜品的时候，需要用到文件名，文件名要保存到菜品表（数据库）里面去
    }

    //由于响应了backend-page-demo-upload.html的47行的请求，上传完成之后，马上发出common/download?name=""请求(提交过来一个name参数，需要用String name接收)
    //通过输出流向浏览器页面来写回数据(所以不需要返回值了),在浏览器展示图片
    //                                  因为输出流需要通过response来获得
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response){
        //需要下载指定的文件
        try {
            //先从（D:\DLSS\里面）已上传的这个文件来读，输入流：通过输入流来读取文件内容
            FileInputStream fileInputStream = new FileInputStream(new File(basePath+name));

            //输出流，通过输出流将读到的文件内容写回浏览器，在浏览器展示图片(通过response响应对象来get)
            ServletOutputStream outputStream = response.getOutputStream();

            response.setContentType("image/jpeg");//设置响应回去的是什么类型的文件

            int len = 0;
            byte[] bytes = new byte[1024];
            //每次读，把读到的内容放到bytes数组里面去
            while ((len = fileInputStream.read(bytes))!=-1)//!=-1说明没有读完，就一直读
            {//读完之后,通过输出流向浏览器来写
                outputStream.write(bytes,0,len);//从第一个开始写，写到len这么长
                outputStream.flush();//写完之后通过flush()来刷新
            }
            //关闭资源
            outputStream.close();
            fileInputStream.close();

         } catch (Exception e) {//FileNotFoundException捕获小的异常，Exception捕获大的异常
            e.printStackTrace();
        }

    }
}
